
#include<iostream>
#include<string>
#include<functional>
#include<pthread.h>
#include<cstdint>

namespace ThreadModule
{
    uint32_t cnt=0;  //原子计数器，方便形成线程名称

    using threadfunc_t= std::function<void()>;
    //​​定义了一个新的类型别名，名叫 threadfunc_t，它的实际类型是 std::function<void()>
    // std::function<void()>是 C++ 标准库中的一个 ​​可调用对象封装类，表示一个没有参数、没有返回值的函数（或可调用对象)
    //std::function<R(Args...)>是 C++11 引入的一个 ​​通用的函数包装器（function wrapper）​​它可以 ​​存储、复制和调用任何可调用对象​​


    //线程状态
    enum class TSTARUS
    {
        THREAD_NEW,
        THREAD_RUNNING,
        THREAD_STOP
    };


    //线程
    class Thread
    {
        private:

        //线程创建时要执行的函数
        static void* run(void* obj)  //加上static可以去掉类内的this指针，若在类外调参数较为麻烦
        {
            Thread* self =static_cast<Thread*>(obj);
            //static_cast是 C++ 中用于在相关类型之间进行编译时类型转换的关键字，它是类型安全的（在合理范围内）
            //static_cast<目标类型>(表达式)

            pthread_setname_np(pthread_self(),self->_name.c_str());//设置线程
            //​​pthread_setname_np​​ 是 ​​POSIX 线程（pthread）库提供的一个函数​​，用于 ​​设置线程的名称（thread name）​​，也就是给一个线程起一个可读的名字，方便调试和日志跟踪
            //np 是 ​​"non-portable"（不可移植）​​ 的缩写 ✅ 表示这个函数 ​​不是 POSIX 标准的一部分​​，是某些系统（如 Linux）的扩展功能，可能 ​​不跨平台兼容​​（比如 macOS 或某些 BSD 不支持

            self->_status=TSTARUS::THREAD_RUNNING;

            if(!self->_joined)
            {
                pthread_detach(pthread_self());

            }
            self->_func();
            return nullptr;

        }

        //后期加锁保护     
        void Setname()
        {
            _name="Thread-" + std::to_string(cnt++);
        }


        public:
            Thread(threadfunc_t func): _status(TSTARUS::THREAD_NEW),_joined(true),_func(func)
            {
                Setname();
            }

            void EnableDetach()
            {
                if(_status==TSTARUS::THREAD_NEW)
                _joined=false;
            }

            void EnableJoined()
            {
                if(_status==TSTARUS::THREAD_NEW)
                _joined=true;

            }
            bool start() //若是正在运行返回true,否则创建进程，创建成功返回true，失败返回false
            {
                if(_status==TSTARUS::THREAD_RUNNING)
                return true;
                int n=::pthread_create(&_id,nullptr,run,this);
                if(n!=0)
                return false;
                return true;
            }
            bool join()
            {
                if(_joined)
                {
                    int n=pthread_join(_id,nullptr);
                    if(n!=0)
                    return false; //等待失败

                    return true;
                }
                return false;
            }
            ~Thread(){}


        private:
        std::string _name;
        pthread_t _id;
        TSTARUS _status;
        bool _joined;
        threadfunc_t _func;//想要线程执行的自己的方法

        
    };





}

